package com.llf.util;

import com.llf.config.AllNodeCommonMsg;
import com.llf.dao.node.Node;
import com.llf.dao.pbft.MsgType;
import com.llf.dao.pbft.PbftMsg;
import lombok.extern.slf4j.Slf4j;

/**
 * @author: Li Linfeng
 * @description: pbft的工作流程
 * this is the most important thing
 * 一致性协议的流程
 */
@Slf4j
public class Pbft {

    private Node node = Node.getInstance();

    /**
     * 发送view请求
     *
     * @return
     */
    public boolean pubView() {

        /**
         * 如果区块链中的网络节点小于3
         */
        if (AllNodeCommonMsg.allNodeAddressMap.size() < 3) {
            log.warn("区块链中的节点小于等于3");
            node.setViewOK(true);
            // 将节点消息广播出去
            ClientUtil.publishIpPort(node.getIndex(), node.getAddress().getIp(), node.getAddress().getPort());
            return true;
        }

        log.info("结点开始进行view同步操作");
        // 初始化view的msg
        PbftMsg view = new PbftMsg(MsgType.GET_VIEW, node.getIndex());
        ClientUtil.clientPublish(view);
        return true;
    }

    /**
     * 视图发送该表
     *
     * @return
     */
    public boolean changeView() {

        return true;
    }
}
